package com.itcast.service.impl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itcast.dao.CheckItemDao;
import com.itcast.dao.CheckgroupDao;
import com.itcast.dao.SetmealDao;
import com.itcast.entity.PageResult;
import com.itcast.entity.QueryPageBean;
import com.itcast.pojo.CheckItem;
import com.itcast.pojo.Setmeal;
import com.itcast.service.CheckItemService;
import com.itcast.service.SetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.JedisPool;

import java.util.ArrayList;
import java.util.List;

@Service(interfaceClass = CheckItemService.class)
@Transactional
public class CheckItemServiceImpl implements CheckItemService {

    @Autowired  //dao只在服务使用，不需要抽取到外部，只在容器获取就可以
    private CheckItemDao checkItemDao;

    @Autowired
    private CheckgroupDao checkgroupDao;

    @Autowired
    private SetmealDao setmealDao;

    @Autowired
    private SetmealService setmealService;

    @Autowired
    private JedisPool jedisPool;

    /**
     * 添加检查项
     * @param checkItem
     */
    @Override
    public Integer add(CheckItem checkItem) {
        checkItemDao.add(checkItem);
        return checkItem.getId();

    }

    /**
     * 根据条件模糊，分页查询
     * @param queryPageBean
     * @return  返回分页数据，最大条数
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        String queryString = queryPageBean.getQueryString();
        PageHelper.startPage(currentPage,pageSize);

         if(queryString!=null){
             queryString = queryString.trim();
         }
        if (null== queryString || "null".equalsIgnoreCase(queryString) || queryString.length()==0 ){
            queryString=null;
            return getPageResult(queryString);
        }else {
            queryString="%"+queryString+"%";
        return getPageResult(queryString);
        }
    }

    /**
     * 根据id删除检查项
     * @param id
     */
    @Override
    public void delRow(int id) {
//        查询检查组是否与检查项关联，有关联则大于0
        Integer count = checkItemDao.findCount(id);
        if (count>0){
//            如果检查组中包含检查项不允许删除，抛出异常使controller返回失败
            int i = 1/0;
        }else {
//            如果没有关联则删除
            checkItemDao.delRow(id);
        }
    }

    /**
     * 根据ID查询检查项，回显数据
     * @param id
     * @return
     */
    @Override
    public CheckItem findByid(int id) {
        CheckItem checkItem = checkItemDao.findByid(id);
        return checkItem;
    }

    /**
     * 修改检查项数据
     * @param checkItem
     */
    @Override
    public void edit(CheckItem checkItem) {
        checkItemDao.update(checkItem);
    }

    /**
     * 获取与检查项相关的套餐
     * @param id  检查项id
     * @return  套餐集合
     */
    @Override
    public List<Integer> getSetmeaIds(int id) {
        List<Integer> checkgroupIds = checkItemDao.findCheckgroupIdSById(id);
        List<Integer> setmealIdList = new ArrayList<>();
        if (checkgroupIds!=null&& checkgroupIds.size()>0){
            for (Integer checkgroupId : checkgroupIds) {
                List<Integer> setmealIds = checkgroupDao.findSetmealIdsById(checkgroupId);
                if (setmealIds!=null&&setmealIds.size()>0){
                    for (Integer setmealId : setmealIds) {
                        setmealIdList.add(setmealId);
                    }
                }
            }
        }


        return setmealIdList;
    }

    public List<Setmeal> getSetmeals(List<Integer> setmealIdList){
        List<Setmeal> setmealList = new ArrayList<>();
        for (Integer setmealId : setmealIdList) {
            Setmeal setmeal = setmealService.findById(setmealId);
            setmealList.add(setmeal);
        }
        return setmealList;
    }

    /**
     * 抽取分页方法
     * @param queryString
     * @return
     */
    //    抽取调用dao方法，封装PageResult（获得最大条数，和具体数据）
    private PageResult getPageResult(String queryString) {
        Page<CheckItem> page = checkItemDao.findPage(queryString);
        long total = page.getTotal();
        List<CheckItem> result = page.getResult();
        return new PageResult(total,result);
    }

}
